/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.asportoonline.actions;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.asportoonline.business.beans.ClienteManager;
import org.asportoonline.business.beans.LocaleManager;
import org.asportoonline.business.beans.PrenotazioneManager;
import org.asportoonline.business.beans.ProdottoManager;
import org.asportoonline.business.beans.ProdottoPrenotatoManager;
import org.asportoonline.business.delegates.ClienteManagerDelegate;
import org.asportoonline.business.delegates.LocaleManagerDelegate;
import org.asportoonline.business.delegates.PrenotazioneManagerDelegate;
import org.asportoonline.business.delegates.ProdottoManagerDelegate;
import org.asportoonline.business.delegates.ProdottoPrenotatoManagerDelegate;
import org.asportoonline.entities.Cliente;
import org.asportoonline.entities.Locale;
import org.asportoonline.entities.Prenotazione;
import org.asportoonline.entities.Prodotto;
import org.asportoonline.entities.ProdottoPrenotato;
import org.asportoonline.entities.ProdottoPrenotatoID;
import org.asportoonline.various.Utils;

/**
 *
 * @author fe
 */
public class PrenotazioneAction extends HttpServlet {
    private ProdottoManager pm = new ProdottoManagerDelegate();
    private PrenotazioneManager prenm = new PrenotazioneManagerDelegate();
    private ClienteManager cm = new ClienteManagerDelegate();
    private LocaleManager lm = new LocaleManagerDelegate();
    private ProdottoPrenotatoManager prod_pren_manager  = new ProdottoPrenotatoManagerDelegate();

    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String s = request.getParameter("q").toString();
        
        if(s.equals("prenotation_second_step")) {
            String res = elabora_prenotazione_primo_step(request);
            
            if(res.equals("OK")) {
                getServletContext().getRequestDispatcher("/MainController?q=confirm_prenotation").forward(request, response);
            }
            else {
                request.setAttribute("error", res);
                String id_locale = request.getParameter("id_locale").toString();
                getServletContext().getRequestDispatcher("/MainController?q=fetch_restaurant_details_action&ret=restaurant_details&idlocale="+id_locale).forward(request, response);
            }
        }
        
        else if(s.equals("register_prenotation_action")) {
            
            String res = verifica_prenotazione(request);
            
            if(res.equals("OK")) {
                getServletContext().getRequestDispatcher("/MainController?q=fetch_user_prenotations_action").forward(request, response);
            }
            else {
                request.setAttribute("error", res);
                getServletContext().getRequestDispatcher("/MainController?q=confirm_prenotation").forward(request, response);
            }
        }
        
        else if(s.equals("fetch_user_prenotations_action")) {
            HttpSession ses = request.getSession(false);
            Cliente c = cm.cercaCliente(ses.getAttribute("username").toString());
            request.setAttribute("lista_prenotazioni", prenm.elencoPrenotazioniCliente(c));
            getServletContext().getRequestDispatcher("/MainController?q=view_user_prenotations").forward(request, response);
        }
        else if(s.equals("fetch_restaurant_prenotations_action")) {
            int idlocale = Integer.parseInt(request.getParameter("idlocale").toString());
            Locale locale = lm.cercaLocale(idlocale);
            request.setAttribute("lista_prenotazioni", prenm.elencoPrenotazioniLocale(locale));
            getServletContext().getRequestDispatcher("/MainController?q=view_restaurant_prenotations").forward(request, response);
        }

    }
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        processRequest(request, response);
    }

    private String elabora_prenotazione_primo_step(HttpServletRequest request) {
        String num_products = request.getParameter("number_products").toString();
        int num = Integer.parseInt(num_products);
        
        int id_prodotto;
        String num_prodotto;
        int flag = 0;       // se al termine del ciclo resta 0 vuol dire che non ha prenotato nulla

        Prodotto[] lista_prodotti = new Prodotto[num];
        String[] numero_prodotti_prenotati = new String[num];
        
        for(int i=0; i<num; i++) {
            //ret += "prodotto_"+i+"  ("+request.getParameter("id_prodotto_"+i).toString()+"): "+request.getParameter("num_prodotto_"+i).toString()+"\n";
            
            id_prodotto = Integer.parseInt(request.getParameter("id_prodotto_"+i).toString());
            num_prodotto = request.getParameter("num_prodotto_"+i).toString();
            
            if(flag==0 && !num_prodotto.equals("0")) {
                flag = 1;
            }
            
            lista_prodotti[i] = pm.cercaProdotto(id_prodotto);
            numero_prodotti_prenotati[i] = num_prodotto;
        }
        
        if(flag == 0) {
            return "Nessun prodotto prenotato!!";
        }
        
        //ora prendo solo i prodotti che hanno num>0
        List<Prodotto> lp = new ArrayList<Prodotto>();
        List<String> np = new ArrayList<String>();
        for(int i=0; i<lista_prodotti.length; i++) {
            if(!numero_prodotti_prenotati[i].equals("0")) {
                lp.add(lista_prodotti[i]);
                np.add(numero_prodotti_prenotati[i]);                
            }
        }
        
        request.setAttribute("lista_prodotti", lp);
        request.setAttribute("numero_prodotti", np);
        
        return "OK";
        
    }

    private String verifica_prenotazione(HttpServletRequest request) {
        int totale_prodotti = Integer.parseInt(request.getParameter("numero_prodotti").toString());
        int[] id_prodotti = new int[totale_prodotti];
        int[] num_prodotti = new int[totale_prodotti];
        String orario_consegna = request.getParameter("orario_consegna").toString();
        String data_consegna = request.getParameter("data_consegna").toString();
        Calendar datapren = null;
        String descrizione = request.getParameter("descrizione").toString();
        
        String result = "";
        
        for(int i=0; i<totale_prodotti; i++) {
            id_prodotti[i] = Integer.parseInt(request.getParameter("id_prodotto_"+i).toString());
            num_prodotti[i] = Integer.parseInt(request.getParameter("num_prodotto_"+i).toString());
        }
        
        // controllo  l'orario di consegna 
        if(orario_consegna.equals("none")) {
            result = "Inserire l'orario di consegna!!";
        }
        else {        
            // controllo data_consegna
            // la data deve essere valida nel formato,
            // deve partire dal giorno successivo a quello in cui si effettua la prenotazione,
            // non deve coincidere con il giorno di chiusura del locale
            if(!Utils.validateDate(data_consegna)) {
                result = "Formato della data di consegna non valido!!!";
            }
            else {
                Calendar c = Calendar.getInstance();
                String oggi = c.get(Calendar.DAY_OF_MONTH)+"/"+(c.get(Calendar.MONTH)+1)+"/"+c.get(Calendar.YEAR);

                if(Utils.compareDates(data_consegna, oggi) != 1) {
                    result = "Il giorno della consegna deve essere non inferiore a domani!!";
                }
                else {
                    // Calendar.DAY_OF_WEEK restituisce:
                    // Lunedi -> 2
                    // Martedi -> 3
                    // Mercoledi -> 4
                    // Giovedi -> 5
                    // Venerdi-> 6
                    // Sabato -> 7
                    // Domenica -> 1
                    // Nel nostro DB, invece, sono mappati cosi:
                    // Lunedi - Domenica  -->  0, 1, 2, 3, 4, 5, 6

                    String[] app = data_consegna.split("/");
                    datapren = Calendar.getInstance();
                    datapren.set(Integer.parseInt(app[2]), Integer.parseInt(app[1])-1, Integer.parseInt(app[0]));

                    Prodotto p = pm.cercaProdotto(id_prodotti[0]);
                    int closed = p.getLocale().getGiornoChiusura();

                    if(closed != -1) {                
                        int cc = datapren.get(Calendar.DAY_OF_WEEK);

                        // porto cc nel formato che usa il nostro DB
                        if(cc == 1)     cc = 6;
                        else            cc = cc-2;

                        if(closed == cc) {
                            result = "Il giorno di consegna scelto coincide con il giorno di chiusura del locale!!!";
                        }
                    }
                }
            }
        }
        
        if(!result.equals("")) {
            List<Prodotto> lp = new ArrayList<Prodotto>();
            List<String> ln = new ArrayList<String>();

            for(int i=0; i<totale_prodotti; i++) {
                lp.add(pm.cercaProdotto(id_prodotti[i]));
                ln.add(num_prodotti[i]+"");
            }

            request.setAttribute("lista_prodotti", lp);
            request.setAttribute("numero_prodotti", ln);

            return result;                
        }

        // Inserisco la prenotazione
        Prenotazione pren = new Prenotazione();

        pren.setOrarioPrenotazione(orario_consegna);
        pren.setDataPrenotazione(datapren);
        pren.setDescrizione(descrizione);

        HttpSession ses = request.getSession(false);

        Cliente cliente = cm.cercaCliente(ses.getAttribute("username").toString());
        pren.setCliente(cliente);

        Prodotto prod = pm.cercaProdotto(id_prodotti[0]);
        pren.setLocale(prod.getLocale());

        prenm.inserisciPrenotazione(pren);

        // Inserisco i prodotti prenotati      
        ProdottoPrenotato prod_pren;
        ProdottoPrenotatoID idprodpren;
        Prodotto prodotto;

        for(int i=0; i<totale_prodotti; i++) {                                  
            prod_pren = new ProdottoPrenotato();            
            idprodpren = new ProdottoPrenotatoID();

            prodotto = pm.cercaProdotto(id_prodotti[i]);
            idprodpren.setIdpren(pren.getIdPrenotazione());
            idprodpren.setIdprod(prodotto.getIdProdotto());

            prod_pren.setIdProdottoPrenotato(idprodpren);            
            prod_pren.setQuantita(num_prodotti[i]);

            prod_pren_manager.inserisciProdottoPrenotato(prod_pren);
        }                
        
        
        return "OK";
    }
    
    
}
